const express = require('express')
// const fs = require('fs')
// const { promisify } = require('util')

// const readFile = promisify(fs.readFile) // fs.readFile 改成 promise, 入参不变
// const writeFile = promisify(fs.writeFile) // 写文件操作 promise 化
const db = require('./db')
const { logs } = require('./middlewares/logs')

const app = express()

// app.use(express.urlencoded()) // 接收 客户端发送的 urlencoded 格式的数据
app.use(express.json()) // 接收 客户端发送的 json 格式的数据

// function logs(req, res, next) {
// 	console.log(`${req.method}, ${req.url}, ${Date.now()}`)
// 	next()
// }
// 使用 express 中间件机制解决各个请求的日志打印,
// 中间件要在处理所有请求路由的前面
// 防止在各个请求中调用 logs
app.use(logs)

app.get('/', (req, res) => {
	// 记录请求
	// logs(req)
	res.send('/index')
})

app.get('/register', (req, res) => {
	// 记录请求
	// logs(req)
	res.send('/register')
})

app.get('/login', (req, res) => {
	// 记录请求
	// logs(req)
	res.send('/login')
})

app.get('/users', async (req, res) => {
	try {
		// const data = await readFile('./db.json', 'utf8')
		const data = await db.getDb('./db.json')
		res.send(data.users)
	} catch (ex) {
		res.status(500).json({ err: ex })
	}
})

app.post('/users', async (req, res) => {
	// console.log(req.headers, req.body)
	const { body } = req
	if (!body) {
		res.status(403).json({
			err: '缺少用户信息'
		})
	}
	let data = ''
	try {
		data = await db.getDb('./db.json')
	} catch (ex) {
		res.status(500).json({ err: ex })
	} finally {
		// data = JSON.parse(data)
		const { length } = data.users
		const id = length ? data.users[length - 1].id + 1 : 1
		body.id = id
		data.users.push(body)
		try {
			const result = await db.serveDb('./db.json', data)
			if (!result) {
				res.status(200).send({ msg: '添加成功' })
			}
		} catch (ex) {
			res.status(500).json({ err: ex })
		}
	}
})

app.put('/users/:id', async (req, res) => {
	let { id } = req.params
	const { body } = req
	try {
		const data = await db.getDb('./db.json')
		id = Number.parseInt(id)
		const user = data.users.find((user) => user.id === id)
		if (!user) {
			res.status(403).json({ err: '用户不存在' })
		}
		user.username = body.username ? body.username : user.username
		user.age = body.age ? body.age : user.age
		if (!(await db.serveDb('./db.json', data))) {
			res.status(200).json({ msg: '信息修改成功' })
		}

		res.send(user)
	} catch (ex) {
		res.status(500), json({ err: ex })
	}
})

app.listen(3000, () => console.log('running on http://localhost:3000'))
